'''
输入一个正整数 target ，输出所有和为 target 的连续正整数序列（至少含有两个数）。

序列内的数字由小到大排列，不同序列按照首个数字从小到大排列。

 

示例 1：

输入：target = 9
输出：[[2,3,4],[4,5]]
示例 2：

输入：target = 15
输出：[[1,2,3,4,5],[4,5,6],[7,8]]

'''
import math
def findContinuousSequence(target):
    # 我们的间隔从1开始
    i, res = 1, []

    # 根据上面的条件1，限定i的大小，即间隔的范围
    while i * (i + 1) / 2 < target:
        # 根据条件2，如果x不为整数则扩大间隔
        if not (target - i * (i + 1) / 2) % (i + 1):
            # 如果两个条件都满足，代入公式求出x即可，地板除//会把数改成float形式，用int()改回来
            x = int((target - i * (i + 1) / 2) // (i + 1))
            # 反推出y，将列表填入输出列表即可
            res.append(list(range(x, x + i + 1)))
        # 当前间隔判断完毕，检查下一个间隔
        i += 1

    # 由于间隔是从小到大，意味着[x,y]列表是从大到小的顺序放入输出列表res的，所以反转之
    return res[::-1]

def func1(target):
    i = 1  # 滑动窗口的左边界
    j = 1  # 滑动窗口的右边界
    sum = 0  # 滑动窗口中数字的和
    res = []

    while i <= target // 2:
        if sum < target:
            # 右边界向右移动
            sum += j
            j += 1
        elif sum > target:
            # 左边界向右移动
            sum -= i
            i += 1
        else:
            # 记录结果
            arr = list(range(i, j))
            res.append(arr)
            # 左边界向右移动
            sum -= i
            i += 1

    return res
def func2(target):
    if target <= 2:
        return []
    res = []
    for n in range(2, target // 2 + 1):
        temp = target - n * (n - 1) // 2
        if temp <= 0:
            break
        if not temp % n:
            start = temp // n
            res.append([start + i for i in range(n)])

    return res[::-1]

if __name__ == '__main__':
    print(findContinuousSequence(15))